#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QKeyEvent>
#include <QModelIndexList>
#include <QApplication>
#include <QClipboard>
#include <QTableView>
#include <QDebug>
#include <QMessageBox>


QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    Ui::Widget * GetUi() {
        return ui;
    }

    void SetTabView(QTableView *tableView)
    {
        mTableView = tableView;
    }

    ~Widget();
protected:
    // 重写 keyPressEvent 来处理按键事件
    void keyPressEvent(QKeyEvent *event) override {
        if (event->matches(QKeySequence::Copy)) {
            if (mTableView == nullptr) {
                qInfo() << "mTableView is null";
                return;
            }
            QModelIndexList selectedIndexes = mTableView->selectionModel()->selectedIndexes();
            if (!selectedIndexes.isEmpty()) {
                // 存储复制的数据
                QString clipboardText;
                // 对选中的索引进行排序，确保它们按行和列的顺序排列
                std::sort(selectedIndexes.begin(), selectedIndexes.end(), [](const QModelIndex& a, const QModelIndex& b) {
                    if (a.row() == b.row()) {
                        return a.column() < b.column();
                    }
                    return a.row() < b.row();
                });
                int prevRow = selectedIndexes.first().row();
                int prevCol = selectedIndexes.first().column();
                for (const QModelIndex& index : selectedIndexes) {
                    if (index.row()!= prevRow) {
                        clipboardText += "\n";
                        prevRow = index.row();
                        prevCol = index.column();
                    } else if (index.column()!= prevCol) {
                        clipboardText += "\t";
                        prevCol = index.column();
                    }
                    clipboardText += index.data().toString();
                }
                QApplication::clipboard()->setText(clipboardText);
            }
        } else {
            QWidget::keyPressEvent(event);
        }
    }

    // 重写 closeEvent 来处理关闭事件
    void closeEvent(QCloseEvent *event) override {
        QMessageBox::StandardButton reply = QMessageBox::question(this, "确认退出？",
                                                                  "是否确认保存? 修改的数据如果没有执行重新生成excel，可能不会在本地excel文件生效",
                                                                  QMessageBox::Yes | QMessageBox::No);
        if (reply == QMessageBox::Yes) {
            event->accept();
        } else {
            event->ignore();
        }
    }

private:
    Ui::Widget *ui;
    QTableView *mTableView;
};
#endif // WIDGET_H
